package com.java01.string.format;

import java.util.ArrayList;
import java.util.List;

public class StringFormat2 {

	public StringFormat2(){
		List<List<String>> data = new ArrayList<List<String>>();
		List<String> row = new ArrayList<String>();
		row.add("Name");
		row.add("Email");
		row.add("Skills");
		data.add(row);
		
		row = new ArrayList<String>();
		row.add("Alex");
		row.add("alex@java01.com");
		row.add("Java,C");
		data.add(row);
		
		row = new ArrayList<String>();
		row.add("Bob");
		row.add("bob@java01.com");
		row.add("C/C++,PHP");
		data.add(row);
		
		row = new ArrayList<String>();
		row.add("Clare");
		row.add("clare@java01.com");
		row.add("Perl");
		data.add(row);
		
		System.out.println(getTableFormat(data));
	}
	
	public String getTableFormat(List<List<String>> data){
		StringBuffer sb = new StringBuffer();

		if(data.size()==0)
			return sb.toString();
		
		int numOfColumn = data.get(0).size();
		
		//init minimum column width
		int[] columnWidth = new int[numOfColumn];
		for(int i=0;i<columnWidth.length;i++){
			columnWidth[i]= data.get(0).get(i).length();
		}
		
		//extend column width if needed
		for(List<String> row:data){
			for(int i=0;i<row.size();i++){
				int cellWidth = row.get(i).length()+1;
				if(cellWidth > columnWidth[i])
					columnWidth[i]=cellWidth;
			}
		}
		
		//generate bar
		StringBuffer bar = new StringBuffer();
		for(int i=0;i<columnWidth.length;i++){
			bar.append("+");
			for(int j=0;j<columnWidth[i];j++){
				bar.append("-");
			}
		}
		bar.append("+\n");
		
		sb.append(bar.toString());
		
		//generate rows
		for(List<String> row:data){
			for(int i=0;i<row.size();i++){
				String format = "|%1$-"+columnWidth[i]+"s";
				sb.append(String.format(format, row.get(i)));
			}
			sb.append("|\n");
			sb.append(bar.toString());
		}
		return sb.toString();
	}
	
	public static void main(String[] args) {
		new StringFormat2();
	}
}
